#ifndef COMMON_H
#define COMMON_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <signal.h>
#include <errno.h>
#include <nanomsg/nn.h>
#include <nanomsg/pair.h>
#include <nanomsg/reqrep.h>
#include <nanomsg/pubsub.h>
#include <nanomsg/pipeline.h>
#include <nanomsg/bus.h>

// 通用常量定义
#define DEFAULT_PORT        "5555"
#define DEFAULT_TCP_ADDR    "tcp://127.0.0.1:5555"
#define DEFAULT_IPC_ADDR    "ipc:///tmp/nanomsg_demo.ipc"
#define DEFAULT_INPROC_ADDR "inproc://nanomsg_demo"

#define BUFFER_SIZE         1024
#define MAX_MESSAGE_SIZE    4096
#define TOPIC_SIZE          32

// 颜色输出宏定义
#define COLOR_RESET   "\x1b[0m"
#define COLOR_RED     "\x1b[31m"
#define COLOR_GREEN   "\x1b[32m"
#define COLOR_YELLOW  "\x1b[33m"
#define COLOR_BLUE    "\x1b[34m"
#define COLOR_MAGENTA "\x1b[35m"
#define COLOR_CYAN    "\x1b[36m"

// 日志级别
typedef enum {
    LOG_DEBUG = 0,
    LOG_INFO,
    LOG_WARN,
    LOG_ERROR
} log_level_t;

// 消息类型
typedef enum {
    MSG_TEXT = 0,
    MSG_JSON,
    MSG_BINARY,
    MSG_HEARTBEAT
} message_type_t;

// 消息结构体
typedef struct {
    message_type_t type;
    uint32_t sequence;
    uint32_t timestamp;
    uint32_t data_length;
    char data[MAX_MESSAGE_SIZE];
} message_t;

// 统计信息结构体
typedef struct {
    uint64_t messages_sent;
    uint64_t messages_received;
    uint64_t bytes_sent;
    uint64_t bytes_received;
    uint32_t errors;
    time_t start_time;
} stats_t;

// 全局变量声明
extern volatile int g_running;
extern stats_t g_stats;

// 函数声明

/**
 * @brief 初始化统计信息
 */
void init_stats(void);

/**
 * @brief 打印统计信息
 */
void print_stats(void);

/**
 * @brief 重置统计信息
 */
void reset_stats(void);

/**
 * @brief 日志输出函数
 * @param level 日志级别
 * @param format 格式化字符串
 * @param ... 可变参数
 */
void log_message(log_level_t level, const char* format, ...);

/**
 * @brief 错误处理函数
 * @param message 错误消息
 */
void handle_error(const char* message);

/**
 * @brief 信号处理函数
 * @param sig 信号编号
 */
void signal_handler(int sig);

/**
 * @brief 设置信号处理器
 */
void setup_signal_handlers(void);

/**
 * @brief 创建消息
 * @param type 消息类型
 * @param data 消息数据
 * @param length 数据长度
 * @return 创建的消息指针
 */
message_t* create_message(message_type_t type, const char* data, uint32_t length);

/**
 * @brief 销毁消息
 * @param msg 消息指针
 */
void destroy_message(message_t* msg);

/**
 * @brief 序列化消息
 * @param msg 消息指针
 * @param buffer 输出缓冲区
 * @param buffer_size 缓冲区大小
 * @return 序列化后的数据长度，失败返回-1
 */
int serialize_message(const message_t* msg, char* buffer, size_t buffer_size);

/**
 * @brief 反序列化消息
 * @param buffer 输入缓冲区
 * @param length 数据长度
 * @return 反序列化后的消息指针，失败返回NULL
 */
message_t* deserialize_message(const char* buffer, size_t length);

/**
 * @brief 获取当前时间戳
 * @return 时间戳（秒）
 */
uint32_t get_timestamp(void);

/**
 * @brief 获取时间戳字符串
 * @param buffer 输出缓冲区
 * @param size 缓冲区大小
 * @return 格式化的时间字符串
 */
const char* get_timestamp_string(char* buffer, size_t size);

/**
 * @brief 解析地址类型
 * @param addr 地址字符串
 * @return 地址类型字符串
 */
const char* parse_address_type(const char* addr);

/**
 * @brief 检查nanomsg版本
 */
void check_nanomsg_version(void);

/**
 * @brief 设置套接字选项
 * @param sock 套接字文件描述符
 * @param level 选项级别
 * @param option 选项名称
 * @param value 选项值
 * @param size 值大小
 * @return 成功返回0，失败返回-1
 */
int set_socket_option(int sock, int level, int option, const void* value, size_t size);

/**
 * @brief 获取套接字选项
 * @param sock 套接字文件描述符
 * @param level 选项级别
 * @param option 选项名称
 * @param value 输出值缓冲区
 * @param size 值大小指针
 * @return 成功返回0，失败返回-1
 */
int get_socket_option(int sock, int level, int option, void* value, size_t* size);

/**
 * @brief 等待套接字就绪
 * @param sock 套接字文件描述符
 * @param timeout 超时时间（毫秒）
 * @return 就绪返回1，超时返回0，错误返回-1
 */
int wait_socket_ready(int sock, int timeout);

/**
 * @brief 安全发送消息
 * @param sock 套接字文件描述符
 * @param buffer 发送缓冲区
 * @param length 数据长度
 * @param flags 发送标志
 * @return 发送的字节数，失败返回-1
 */
int safe_send(int sock, const void* buffer, size_t length, int flags);

/**
 * @brief 安全接收消息
 * @param sock 套接字文件描述符
 * @param buffer 接收缓冲区
 * @param length 缓冲区大小
 * @param flags 接收标志
 * @return 接收的字节数，失败返回-1
 */
int safe_recv(int sock, void* buffer, size_t length, int flags);

/**
 * @brief 打印帮助信息
 * @param program_name 程序名称
 */
void print_usage(const char* program_name);

/**
 * @brief 打印nanomsg信息
 */
void print_nanomsg_info(void);

// 内联函数定义

/**
 * @brief 增加发送统计
 * @param bytes 发送字节数
 */
static inline void update_send_stats(size_t bytes) {
    g_stats.messages_sent++;
    g_stats.bytes_sent += bytes;
}

/**
 * @brief 增加接收统计
 * @param bytes 接收字节数
 */
static inline void update_recv_stats(size_t bytes) {
    g_stats.messages_received++;
    g_stats.bytes_received += bytes;
}

/**
 * @brief 增加错误统计
 */
static inline void update_error_stats(void) {
    g_stats.errors++;
}

/**
 * @brief 检查是否应该继续运行
 * @return 继续运行返回1，停止返回0
 */
static inline int should_continue(void) {
    return g_running;
}

// 调试宏
#ifdef DEBUG
    #define DEBUG_PRINT(fmt, ...) \
        log_message(LOG_DEBUG, "[DEBUG] %s:%d " fmt, __FILE__, __LINE__, ##__VA_ARGS__)
#else
    #define DEBUG_PRINT(fmt, ...) do {} while(0)
#endif

// 错误检查宏
#define CHECK_ERROR(condition, message) \
    do { \
        if (condition) { \
            handle_error(message); \
            return -1; \
        } \
    } while(0)

// 套接字检查宏
#define CHECK_SOCKET(sock) \
    CHECK_ERROR((sock) < 0, "Failed to create socket")

// 绑定检查宏
#define CHECK_BIND(result, addr) \
    CHECK_ERROR((result) < 0, "Failed to bind to " addr)

// 连接检查宏
#define CHECK_CONNECT(result, addr) \
    CHECK_ERROR((result) < 0, "Failed to connect to " addr)

#endif // COMMON_H